package com.niiwoo.civet.account.service.local.check.job.api;

import com.niiwoo.civet.account.service.local.check.job.enums.TaskStepEnum;

import java.util.List;

/**
 * 对账记录相关服务接口
 * @author zhoulinquan
 *
 */
public interface CheckRecordService {
	
	/**
	 * 保存
	 * @param checkDate
	 */
	Long save(TaskStepEnum step, String checkDate);
	
	/**
	 * 根据步骤更新对账记录状态
	 * @param step 
	 * @param fileDate
	 */
	void update(TaskStepEnum step, Long checkRecordId);
	
	/**
	 * 获取对账记录状态
	 * @param recordId 对账记录ID
	 * @param fileDate 对账日期
	 * @return
	 */
	boolean getCheckResult(Long checkRecordId, String fileDate);
	
	/**
	 * 根据对账日期获取之前的对账记录
	 * @param fileDate
	 * @return
	 */
	Long findCheckRecord(String fileDate);
	Long findCheckRecord(Long checkRecordId);
	
	/**
	 * 获取当前对账任务的状态
	 * @param recordId
	 * @return
	 */
	TaskStepEnum findTaskStep(Long checkRecordId);
	
	/**
	 * 获取对应对账文件解析状态
	 * @param checkType 对账文件类型
	 * @param checkDate 对账日期
	 * @return
	 */
	boolean checkParseTask(String checkType, String checkDate);
	
	/**
	 * 记录解析入库任务执行状态记录
	 * @param checkType 对账文件类型
	 * @param checkDate 对账日期
	 * @param isSuccess 成功与否
	 */
	void saveParseTask(String checkType, String checkDate, boolean isSuccess);

	/**
	 * 如果中途因为异常跳出则需要更新对应对账记录中的备注信息，说明大致问题
	 * @param step 对账执行步骤
	 * @param checkRecordId 对账记录ID
	 * @param isRecheck 是否是重新对账；true-是
	 */
	void updateLastStepRemark(TaskStepEnum step, Long checkRecordId, boolean isRecheck);
	
	/**
	 * 上传zip文件到文件服务器并更新对应的上传状态
	 * @param checkFilePath
	 * @param checkRecordId
	 */
	String uploadCheckFile(String checkFilePath, Long checkRecordId);
	
	/**
	 * 下载对账文件zip包
	 * @param fromBankApi 是否从存管银行下载
	 * @param checkRecordId 对账记录ID
	 * @param targetZipPath 下载保存路径
	 * @param checkDate 对账日期
	 * 
	 * @exception
	 */
	void downloadCheckFile(boolean fromBankApi, Long checkRecordId, String targetZipPath, String checkDate) throws Exception;

	/**
	 * 批量保存异常账单
	 * @param list
	 */
	void batchSaveCheckException(List<Object> list);
	
	/**
	 * 根据对账记录ID删除其关联的所有异常账单
	 * @param checkRecordId 对账记录ID
	 */
	void deleteAllCheckException(Long checkRecordId);
	
	/**
	 * 对账后置事件，用于对账完成之后
	 * @param checkDate 对账日期
	 * @param checkRecordId 对账记录ID
	 */
	void afterCheck(String checkDate, Long checkRecordId) throws Exception;

	/**
	 * 统计对账异常数据多少条
	 * @param checkRecordId
	 */
	int countExceptionRecordForHandleType(Long checkRecordId);
}
